package com.wang.java.basic.features.reference;

import com.wang.common.domain.User;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * java的引用：强引用、软引用、弱引用、虚引用
 * 版本：jdk1.2+
 */
public class ReferenceTest {
    public static void main(String[] args) {
        // 强引用（Strong Reference），代码中普遍存在的Object object = new Object();。GC Root不可达时回收
        User user = new User();
        // 软引用（Soft Reference），有用但非必须的对象，OOM之前会对这部分对象进行垃圾回收，通常可以用于系统缓存
        String sortReferent = "softReferent";
        SoftReference<String> softReference = new SoftReference<>(sortReferent);
        // 弱引用（Weak Reference），非必须对象，可以存活到下次GC，ThreadLocal中有用到
        String weakReferent = "weakReferent";
        WeakReference<String> weakReference = new WeakReference<>(weakReferent);
        // 虚引用（Phantom Reference），随时可能被回收，使用场景未知
        String phantomReferent = "phantomReferent";
        PhantomReference<String> phantomReference = new PhantomReference<>(phantomReferent, new ReferenceQueue<>());
    }
}
